# -*- coding:utf-8 -*-
# title           :
# description     :
# author          :Python超人/三月三提供
# date            :2024-06-01
# link            :https://gitcode.net/pythoncr/
# python_version  :3.9
# ==============================================================================
import os.path

from 神笔码靓.神笔库.通用工具集 import *
from 神笔码靓.神笔库.形状工具集 import 多边形工具
from 神笔码靓.神笔库.PDF工具集 import *
from 神笔码靓.码靓库.手工.几何体展开图 import 几何体展开图


class 足球展开图(几何体展开图):
    def __init__(self, 作品文件路径, 页面大小, 显示标签=是):
        super(足球展开图, self).__init__(作品文件路径, 页面大小, 显示标签)
        黄 = "#FFE564"
        红 = "#ED4948"
        蓝 = "#418CE2"
        橙 = "#FB974C"
        绿 = "#7AB644"
        # 白 = 颜色.白色
        紫 = "#E99BFF"
        self.颜色集 = [蓝, 黄, 红, 橙, 绿]
        self.颜色字典 = {
            1: 紫, 17: 紫, 11: 紫, 29: 紫,
            2: 黄, 3: 黄, 16: 黄, 18: 黄, 19: 黄, 31: 黄,
            6: 红, 21: 红, 14: 红, 28: 红, 7: 红, 24: 红,
            8: 蓝, 23: 蓝, 5: 蓝, 22: 蓝, 12: 蓝, 30: 蓝,
            9: 橙, 26: 橙, 13: 橙, 27: 橙,
            4: 绿, 10: 绿, 25: 绿, 15: 绿, 32: 绿, 20: 绿,
        }
        self.序号 = 0

    def 画线(self, 顶点):
        self.序号 += 1

        填充颜色 = self.颜色字典.get(self.序号, None)
        if 填充颜色 is None:
            填充颜色 = self.颜色集[self.序号 % len(self.颜色集)]

        self.连直线(顶点, 填充颜色=填充颜色, 描边颜色=颜色.灰色, 闭合=True)

        # 缩放并模糊边缘，达到立体阴影的效果
        缩放顶点列表 = 多边形工具.计算缩放顶点(顶点, 0.97)
        self.连直线(缩放顶点列表, 填充颜色=填充颜色, 描边颜色=颜色.黑色, 闭合=True, 描边宽度=2).模糊(3)

        # cx, cy = 多边形工具.获取中心点(顶点)
        # self.写字(x=cx, y=cy, 文字=str(self.序号), 字体大小=50)

    def 写顶点标签(self, 顶点, x, y, 标签):
        if len(顶点) == 5:
            字体颜色 = 颜色.白色
        else:
            字体颜色 = 颜色.黑色
        self.写字(x, y, 标签, 字体大小=12, 填充颜色=字体颜色)

    def 初始化(self):
        self.页面索引号 = 0
        # 因为 页面大小=纸张大小.A4_纵向(2)，所以 每页高 = 高 除以 2
        self.每页高 = self.高 / 2

    def 构建顶点(self):
        # 构建展开图的顶点，从初始顶点1,2开始
        # 将参数 显示标签=否 改为 显示标签=是，即可看到顶点的序号
        顶点号列表 = [
            (1, 2, 3, 4, 5, 6),  # 六边形
            (5, 4, 7, 8, 9, 10),  # 六边形
            (2, 1, 11, 12, 13),  # 五边形
            (9, 8, 14, 15, 16),  # 五边形
            (8, 7, 17, 18, 19, 20),  # 六边形
            (10, 9, 21, 22, 23, 24),  # 六边形
            (4, 3, 25, 26, 27),  # 五边形
            (6, 5, 28, 29, 30),  # 五边形
            (3, 2, 31, 32, 33, 34),  # 六边形
            (1, 6, 35, 36, 37, 38),  # 六边形
            (34, 33, 39, 40, 41, 42),  # 六边形
            (32, 31, 43, 44, 45, 46),  # 六边形
            (36, 35, 47, 48, 49, 50),  # 六边形
            (38, 37, 51, 52, 53, 54),  # 六边形
            (33, 32, 55, 56, 57),  # 五边形
            (37, 36, 58, 59, 60)  # 五边形
        ]
        return self.顶点号构建(顶点号列表)

    def 构建粘贴线_1(self):
        粘贴线基础点列表 = [
            (14, 15), (15, 16), (21, 22), (22, 23), (23, 24),
            (47, 48), (48, 49), (49, 50), (58, 59), (59, 60),
            (51, 52), (52, 53), (53, 54), (43, 44), (44, 45), (45, 46),
            (55, 56), (56, 57), (39, 40), (40, 41), (41, 42),
            (17, 18), (18, 19), (19, 20)
        ]
        self.顶点号构建粘贴线(粘贴线基础点列表, 距离=35)

    def 三角粘贴线间隙处理(self, 顶点号列表, 方向=1):
        """

        :param 顶点号列表: 3个顶点号
        :param 方向: 调整方向，避免
        :return:
        """
        粘贴点1, 中间点, 粘贴点2 = 顶点号列表
        fraction = 10  # 越大越接近中间点，要保留一定的间隙，取值不能太大。太小，间隙就太大。
        粘贴点1坐标, 中间点坐标, 粘贴点2坐标 = self.获取顶点坐标(粘贴点1), self.获取顶点坐标(中间点), self.获取顶点坐标(粘贴点2)
        if 方向 == 1:
            points = [self.移动粘贴点(粘贴点1坐标, 粘贴点2坐标, fraction),
                      self.移动粘贴点(中间点坐标, 粘贴点2坐标, fraction),
                      粘贴点2坐标]
        else:
            points = [粘贴点1坐标,
                      self.移动粘贴点(中间点坐标, 粘贴点1坐标, fraction),
                      self.移动粘贴点(粘贴点2坐标, 粘贴点1坐标, fraction)]

        self.连直线(points, 描边样式="2,2")

    def 移动粘贴点(self, A, B, fraction):
        """
        为了保留间隙，需要移动粘贴点，通过 fraction 进行控制
        :param A:
        :param B:
        :param fraction:
        :return:
        """
        # 假设A和B是二维点，形如(x, y)
        # 计算A和B之间的向量
        vector_AB = [B[0] - A[0], B[1] - A[1]]
        # 计算向量的1/3长度
        one_third_AB = [vector_AB[0] / fraction, vector_AB[1] / fraction]
        # 计算新的点C的坐标
        C = [A[0] + one_third_AB[0], A[1] + one_third_AB[1]]
        return C

    def 构建粘贴线_2(self):
        粘贴线基础点列表 = [
            (28, 29), (29, 30),
            (11, 12), (12, 13),
            (25, 26), (26, 27)
        ]

        self.顶点号构建粘贴线(粘贴线基础点列表, 距离=35)

        self.三角粘贴线间隙处理([8, 20, 14])
        self.三角粘贴线间隙处理([16, 21, 9], 2)
        self.三角粘贴线间隙处理([5, 10, 28])
        self.三角粘贴线间隙处理([30, 35, 6], 2)
        self.三角粘贴线间隙处理([36, 50, 58])
        self.三角粘贴线间隙处理([60, 51, 37], 2)
        self.三角粘贴线间隙处理([1, 38, 11])
        self.三角粘贴线间隙处理([13, 31, 2], 2)
        self.三角粘贴线间隙处理([32, 46, 55])
        self.三角粘贴线间隙处理([57, 39, 33], 2)
        self.三角粘贴线间隙处理([3, 34, 25])
        self.三角粘贴线间隙处理([27, 7, 4], 2)

    def 页面设置(self, 设置: 纸张设置):
        # 输出 PDF 文件，以及 页面打印，在这里设置好
        设置.上页边距 = "0cm"
        设置.下页边距 = "0"
        设置.左页边距 = "0.1cm"
        设置.右页边距 = "0"
        设置.页面方向 = 纸张方向.纵向
        设置.页面尺寸规格 = "A4"
        设置.页面缩放 = 1.0

    def 初始顶点(self):
        高 = self.每页高
        # 定义足球一个初始边的两个点，足球展开图从这里开始
        顶点1 = (self.宽 / 2.28, 高 / 1.8 + self.页面索引号 * 高)
        顶点2 = 多边形工具.找点(顶点1, 角度=0, 距离=self.宽 / 8.3)
        return 顶点1, 顶点2

    # def 构建纹理_(self, 面顶点列表):
    #     if self.纹理图 is None:
    #         return
    #
    #     for 编号, 面顶点 in 索引列举(面顶点列表):
    #         if len(面顶点) == 6:
    #             面中心x, 面中心y = 多边形工具.获取中心点(面顶点)
    #             self.贴图(x=面中心x, y=面中心y, 图片文件=self.纹理图).缩放(0.196)
    #             self.写字(x=面中心x, y=面中心y, 文字=str(编号))

    def 创作(self):
        # self.显示图框()
        面顶点列表 = self.构建顶点()

        self.写字(250, 885, "对接A")
        self.写字(525, 885, "对接B")

        self.写字(340, 1250, "对接A").旋转(-34)
        self.写字(433, 1250, "对接B").旋转(34)

        self.连直线([(250, 885), (340, 1250)], 描边样式="5,3")
        self.连直线([(525, 885), (433, 1250)], 描边样式="5,3")

        self.构建粘贴线_1()
        self.构建粘贴线_2()

        self.页面索引号 = 1
        self.顶点A, self.顶点B = self.初始顶点()

        面顶点列表 = self.构建顶点()

        self.构建粘贴线_2()


if __name__ == '__main__':
    足球 = 足球展开图(作品文件路径=f"彩色足球展开图.svg", 页面大小=纸张大小.A4_纵向(2), 显示标签=否)
    足球.完成()
    足球.生成PDF()
